import { registerComponent, getCompList, getComp, hideComp, showComp, getCompGroup, hideCompGroup, showCompGroup } from './componentManager.js';
import { generateData, storage, manualSetPageTemplate, getPageTepl, resetPagePanel, setPageTypeSelect, validateFormData, setPageData, getPageData, getPageComponents, setPageFieldData, clearPageData, setPageComponentValue, setPageComponentProps } from './pageManager.js';
import { revoke } from './common/util/revoke.js'

// 管理器
const Manager = () => {

    /**
     * 注册组件
     * @param {*} data 需要注册的组件数据
     * @returns 返回调用注册组件的函数
     */
    const register = (data) => {
        return registerComponent(data);
    }

    /**
     * 获取当前已注册的组件数据
     * @returns 返回组件列表数据
     */
    const getComponentList = () => {
        return getCompList()
    }

    // 设计器管理
    const designer = {
        getComponent: getComp,                   // 获取组件
        hideComponent: hideComp,                 // 隐藏组件
        showComponent: showComp,                 // 显示组件
        getComponentGroup: getCompGroup,         // 获取组件分组
        hideComponentGroup: hideCompGroup,       // 隐藏组件分组
        showComponentGroup: showCompGroup,       // 显示组件分组
        setPageTemplate: manualSetPageTemplate,  // 手动设置页面模板数据
        getPageTemplate: getPageTepl,            // 获取当前的页面模板数据
        resetPage: resetPagePanel,               // 重置页面设计器的面板
        setPageType: setPageTypeSelect,          // 设置页面类型
        undo: () => { generateData.data = revoke.undo() || generateData.data },   // 撤销
        redo: () => { generateData.data = revoke.redo() || generateData.data },   // 重做
        viewSourceCode: () => storage.jsonViewOpen = true,  // 打开源码弹窗
    }

    // 构造器管理
    const builder = {
        validateForm: validateFormData,       // 校验表单
        setData: setPageData,                 // 设置页面数据
        setFieldData: setPageFieldData,       // 设置页面字段数据
        resetPageData: clearPageData,         // 清空页面数据
        getData: getPageData,                 // 获取页面数据
        getComponent: getPageComponents,          // 获取页面组件
        getComponentList: () => { return generateData.data.children },   // 获取页面组件列表
        setComponentValue: setPageComponentValue,  // 手动设置组件数据
        setComponentProps: setPageComponentProps,  // 手动设置组件属性
    }

    return {
        registerComponent: register,
        getComponentList,
        designer: designer,
        builder: builder
    }
}

export const manager = Manager()




